package 反射.jdk动态代理.v1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Date;

public class App {

	public static void main(String[] args) {

		// 要代理的真实对象
		Programmer programmer = new Programmer();

		// 代理对象的调用处理程序，我们将要代理的真实对象传入代理对象的调用处理的构造函数中，最终代理对象的调用处理程序会调用真实对象的方法
		InvocationHandler handler = new DynamicProxyHandler(programmer);
		/**
		 * 通过Proxy类的newProxyInstance方法创建代理对象，我们来看下方法中的参数
		 * 第一个参数：people.getClass().getClassLoader()，传入appclassloader使用appclassloader对象来加载我们的代理对象
		 * 第二个参数：people.getClass().getInterfaces()，这里为代理类提供的接口是真实对象实现的接口，这样代理对象就能像真实对象一样调用接口中的所有方法
		 * 第三个参数：handler，我们将代理对象关联到上面的InvocationHandler对象上
		 */
		ClassLoader handlerClassLoader = handler.getClass().getClassLoader();
		ClassLoader programmerClassLoader = programmer.getClass().getClassLoader();
		ClassLoader dateClassLoader = new Date().getClass().getClassLoader();

		System.out.println(handlerClassLoader);
		System.out.println(programmerClassLoader);
		System.out.println(dateClassLoader);

		People proxyProgrammer = (People) Proxy.newProxyInstance(programmerClassLoader,
				programmer.getClass().getInterfaces(), handler);

		programmer.p = proxyProgrammer;

		System.out.println(proxyProgrammer.workAndGetReward());

	}
}
